[PHP] Wat is sneller?

10 februari 2012

Uit pure interesse kwam bij mij de vraag naar boven: wat is sneller? Het verdubbelen van getallen met behulp van integers, of via bitwise vermenigvuldiging. De resultaten zijn verrassend en niet zo eenduidig als ik dacht.

Onderaan deze pagina kun je overigens de broncode vinden. De 'wedstrijd' zat in een benchmark tussen het verdubbelen van een getal via een bitwise operator of via een vermenigvuldiging in de code zelf. Hierin onderscheiden we twee statements:

$a = $a * 2;
$a = $a << 1;

Beide voeren in deze test exact hetzelfde uit. De benchmark luidt als volgt:

Benchmark when multiplying integers ($a = $a * 2): 3.00854706764
Result: 2147483648
Benchmark using bitwise operators ($a = $a << 1): 2.77816987038
Result: 2147483648

Difference in speed: 0.230377197266

Wat nu het geval lijkt te zijn, is dat bitwise operators net iets sneller zijn dan het vermenigvuldigen van integers. Op zich binnen de lijn der verwachting.

Nu is de notatie $a = $a * 2; nogal veel typwerk voor de gemiddelde programmeur. Met andere woorden, hoe zit het dan als ook de notaties $a *= 2; en $a <<= 1; worden meegenomen in de benchmark?

Benchmark when multiplying integers ($a = $a * 2): 3.00854706764
Result: 2147483648
Benchmark using bitwise operators ($a = $a << 1): 2.77816987038
Result: 2147483648

Difference in speed: 0.230377197266

Benchmark when multiplying integers ($a *= 2): 2.58673095703
Result: 2147483648
Benchmark using bitwise operators:  ($a <<= 1)2.43510198593
Result: 2147483648

Difference in speed: 0.1516289711

Met andere woorden: het gebruiken van korte operators is een stuk sneller dan dubbele operators. Dat is logisch te verklaren, maar het maakt een groot verschil. Sterker nog: bij het gebruiken van een 'korte' notatie voor integers, is de code sneller dan bij het gebruiken van een lange notatie voor bits.

Benchmarkgegevens reproduceren? Geen probleem. Code:

<?php

$start 
microtime(true);

for(
$t 0$t 1000000$t++)
{
    
$a 2;
    for(
$i 0$i 30$i++)
    {
        
$a $a 2;
    }
}

$end microtime(true);

$bench1 $end $start;

echo(
"Benchmark when multiplying integers (\$a = \$a * 2): " $bench1 PHP_EOL);
echo(
"Result: " $a PHP_EOL);

$start microtime(true);

for(
$t 0$t 1000000$t++)
{
    
$a 2;
    for(
$i 0$i 30$i++)
    {
        
$a $a << 1;
    }
}

$end microtime(true);

$bench2 $end $start;

echo(
"Benchmark using bitwise operators (\$a = \$a << 1): " $bench2 PHP_EOL);
echo(
"Result: " $a PHP_EOL);

$difference $bench1 $bench2;
echo(
PHP_EOL PHP_EOL "Difference in speed: " $difference PHP_EOL PHP_EOL);

$start microtime(true);

for(
$t 0$t 1000000$t++)
{
    
$a 2;
    for(
$i 0$i 30$i++)
    {
        
$a *= 2;
    }
}

$end microtime(true);

$bench1 $end $start;

echo(
"Benchmark when multiplying integers (\$a *= 2): " $bench1 PHP_EOL);
echo(
"Result: " $a PHP_EOL);

$start microtime(true);

for(
$t 0$t 1000000$t++)
{
    
$a 2;
    for(
$i 0$i 30$i++)
    {
        
$a <<= 1;
    }
}

$end microtime(true);

$bench2 $end $start;

echo(
"Benchmark using bitwise operators:  (\$a <<= 1)" $bench2 PHP_EOL);
echo(
"Result: " $a PHP_EOL);

$difference $bench1 $bench2;
echo(
PHP_EOL PHP_EOL "Difference in speed: " $difference);


?>

Tweet dit artikel:


Of Like dt artikel op Facebook!

Twitter


 

Internet Marketing

Een zoekmachine bouwen #8 - PageRank, Zoeken, etc.
Geplaatst op 5 december 2019

Een zoekmachine bouwen #7 - Backlinks & Tabellen
Geplaatst op 22 juli 2018

Een zoekmachine bouwen #6 - Full page cache
Geplaatst op 13 juli 2018

Een zoekmachine bouwen #5 - Een stap verder
Geplaatst op 11 juli 2018

Auteur:

 

TimeTick producten
Urenregistratie software
Gratis urenregistratie software